package com.haidechizi.fastadmin.modules.oss.cloud;

import com.haidechizi.fastadmin.common.exception.BusinessException;
import com.haidechizi.fastadmin.common.utils.DateUtils;
import com.haidechizi.fastadmin.common.utils.FileUtils;
import com.haidechizi.fastadmin.common.utils.GlobalUtils;
import com.haidechizi.fastadmin.modules.oss.utils.OssUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

/**
 * @author wangdejun
 */
@Slf4j
public class LocalStorageService extends CloudStorageService {

    /**
     * 文件上传
     *
     * @param data   文件字节数组
     * @param suffix 文件路径，包含文件名
     * @return 返回http地址
     */
    @Override
    public String upload(byte[] data, String suffix) {
        String savePath = savePath(suffix);
        File file = new File(GlobalUtils.getFilePath() + savePath);
        try {
            FileUtils.writeByteArrayToFile(file,data);
        } catch (IOException e) {
            log.error("写入文件失败");
        }
        return savePath;
    }

    /**
     * 文件上传
     *
     * @param data   文件字节数组
     * @param suffix 后缀
     * @return 返回http地址
     */
    @Override
    public String uploadSuffix(byte[] data, String suffix) {
        return upload(data, suffix);
    }

    /**
     * 文件上传
     *
     * @param inputStream 字节流
     * @param path        文件路径，包含文件名
     * @return 返回http地址
     */
    @Override
    public String upload(InputStream inputStream, String path) {
        try {
            byte[] data = IOUtils.toByteArray(inputStream);
            return this.upload(data, path);
        } catch (IOException e) {
            throw new BusinessException("上传文件失败", e);
        }
    }

    /**
     * 文件上传
     *
     * @param inputStream 字节流
     * @param suffix      后缀
     * @return 返回http地址
     */
    @Override
    public String uploadSuffix(InputStream inputStream, String suffix) {
        return upload(inputStream, suffix);
    }

    private String savePath(String suffix) {
        StringBuilder sb = new StringBuilder();
        sb.append("/")
                .append(OssUtils.userFile)
                .append("/")
                .append(DateUtils.formatDate(new Date(), "yyyy-MM-dd"))
                .append("/");
        boolean isImage = OssUtils.isImage(suffix);
        if (isImage) {
            sb.append("image");
        } else {
            sb.append("file");
        }
        String fileName = UUID.randomUUID().toString();
        sb.append("/").append(fileName).append(suffix);
        return sb.toString();
    }
}
